#ifndef _SOCKET_HPP_
#define _SOCKET_HPP_

//TODO: revoir include
#include <windows.h>
#include <winsock.h>
#include "Thread.hpp"

// PHAT: faudrait pas se reduire a l'essentiel? c'est une super grosse classe qu'on utilisera a peine...
class Socket
{
public:
	Socket(const struct sockaddr * adr, int sizeAdr);
	Socket();
	~Socket(void);
public:
	//socket layer
	SOCKET CreateSocket(/*TYPE*/); //datagram or stream
	int Connect(SOCKET s, const struct sockaddr * adr, int sizeAdr);
	int Close(SOCKET s);
	int Select(SOCKET s);
	int Bind(SOCKET s, const struct sockaddr * adr, int sizeAdr);
	SOCKET Accept(SOCKET s, struct sockaddr *addr, int *addrlen);
	int SetOptions(SOCKET s, int level, int optname, const char * optval, int optlen);
	int GetOptions(SOCKET s, int level, int optname, char * optval, int *optlen);
	int Listen(SOCKET s, int backlog);
	int Receive(SOCKET s, char * buf, int len, int flags);
	int ReceiveFrom(SOCKET s, char * buf, int len, int flags, struct sockaddr * from, int * fromlen);
    int Send(SOCKET s, const char *buf, int len, int flags);
    int SendTo(SOCKET s, const char *buf, int len, int flags,const struct sockaddr *to , int tolen);
    int Shutdown(SOCKET s, int how);

	//accesseur
	void SetHostname();
	void SetIpAdress();
	void * GetHostname();
	void * GetIpAdress();

	//error
	int GetError(void);

private:
	void Init(void);
	void End(void);

private:
	SOCKET sock;
	int lastError;
};

#endif